<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>集合</title>
</head>
<body>
    <script>
        class Set{
            //属性
            items = {}

            //集合中的常见方法
            //添加一个元素
            add(val){
                //判断是否重复
                if(this.has(val)) return false;
                //不重复则添加
                this.items[val] = val;
                //添加成功
                return true;
            }
            //集合中是否包含目标元素
            has(val){
                //判断集合中是否存在
                return this.items.hasOwnProperty(val);
            }
            //删除一个元素
            remove(val){
                //判断是否有这个要删除的元素
                if(this.has(val)){
                    //删除
                    delete this.items[val];
                    //删除成功
                    return true;
                }else{
                    //删除失败
                    return false;
                }
            }
            //清空集合
            clear(){
                this.items = {};
            }
            //集合的长度
            size(){
                //先获取集合的keys数组,然后再根据数组长度得到集合长度
                return Object.keys(this.items).length;
            }
            //集合的所有值
            values(){
                return Object.values(this.items);
            }
        
            //集合间的操作
            //并集
            union(otherSet){
                let newSet = new Set();
                for (const item in this.items) {
                    newSet.add(item);
                }
                for(const val of otherSet.values()){
                    newSet.add(val);
                }
                return newSet;
            }
            
            //交集操作
            intersection(otherSet){
                let newSet = new Set();
                if(this.size() <= otherSet.size()){
                    this.values().forEach(element => {
                        if(otherSet.has(element)){
                            newSet.add(element);
                        }
                    });
                }else{
                    otherSet.values().forEach(element =>{
                        if(this.has(element)){
                            newSet.add(element);
                        }
                    });
                }
                return newSet;
            }
            
            //差集操作
            difference(otherSet){
                let newSet = new Set();

                this.values().forEach(val=>{
                    if(!otherSet.has(val)){
                        newSet.add(val);
                    }
                })
                return newSet;
            }
        
            //子集操作
            subset(otherSet){
                let flag = false;
                otherSet.values().forEach(val=>{
                    if(this.has(val)){
                        flag = true;
                    }else{
                        flag = false;
                    }
                });
                return flag;
            }
        }

        let list = new Set();

        //测试添加方法
        list.add('111');
        list.add('222');
        list.add('333');
        list.add('444');
        console.log(list.values());

        //测试remove方法
        /* list.remove('111');
        console.log(list.values()); */

        //测试size()
        //console.log(list.size());

        //测试clear()
        //list.clear();

        //测试size()
        //console.log(list.size());

        //测试union():并集
        /* let list2 = new Set();
        list2.add('aaa');
        list2.add('bbb');
        list2.add('222');
        list2.add('111');
        console.log(list2.values());
        console.log(list.union(list2).values()); */

        //测试intersection():交集
        /* let list2 = new Set();
        list2.add('aaa');
        list2.add('bbb');
        list2.add('222');
        list2.add('111');
        console.log(list2.values());
        console.log(list.intersection(list2).values()); */

        //测试difference(set):差集
        /* let list2 = new Set();
        list2.add('aaa');
        list2.add('bbb');
        list2.add('222');
        list2.add('111');
        console.log(list2.values());
        console.log(list.difference(list2).values()); */

        //测试subset():子集
        /* let list2 = new Set();
        list2.add('222');
        list2.add('111');
        list2.add('aaa');
        console.log(list2.values());
        console.log(list.subset(list2)); */
    </script>
</body>
</html>